﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data;
using BMG.BLL.Classes;

namespace BMG.BackOffice.UserControls
{
    /// <summary>
    /// Application BMG
    /// Création le 02/05/2011
    /// 
    /// Classe partielle du user controle lié à la gestion des catégories
    /// 
    /// Modifications
    /// -
    /// </summary>
    public partial class CategoriesManager : UserControl
    {
        const string DefaultText = "Intitulé ou descrition de la catégorie";

        public CategoriesManager()
        {
            InitializeComponent();
            PopulateAndBind();
            cbbParentSearch.SelectedIndex = 0;

            btnValiderModif.IsEnabled = false;
            btnSupprimer.IsEnabled = false;
        }

        /// <summary>
        /// Remplir les controles
        /// </summary>
        public void PopulateAndBind()
        {
            DataTable dt = CATEGORIE_MANAGER.GetList(false);
            DataTable dtWithNull = CATEGORIE_MANAGER.GetList(true);
            DataTable Historique = CATEGORIE_MANAGER.GetHistorique(null, DateTime.Today, DateTime.Now.AddHours(1));

            listViewListe.ItemsSource = dt.DefaultView;
            listViewListe.SelectedValuePath = "id_cat";
            cbbParent.ItemsSource = dtWithNull.DefaultView;
            cbbParentSearch.ItemsSource = dtWithNull.DefaultView;
            listViewHistorique.ItemsSource = Historique.DefaultView;

            tbxDescriptionSearch.Text = DefaultText;
            if (listViewListe.SelectedItems.Count != 1)
            {
                btnValiderModif.IsEnabled = false;
                btnSupprimer.IsEnabled = false;
            }

        }

        /// <summary>
        /// Evenement appelé par le clic du bouton de recherche
        /// </summary>
        /// <param name="sender">Objet déclencheur de l'événement</param>
        /// <param name="e">Paramètres de l'événement</param>
        private void btnSearch_Click(object sender, RoutedEventArgs e)
        {            
            int? id_parent;
            id_parent = (cbbParentSearch.SelectedValue ==  null) ? (int?) null : Int32.Parse(this.cbbParentSearch.SelectedValue.ToString());  
            string Description = (tbxDescriptionSearch.Text == DefaultText) ? "" : tbxDescriptionSearch.Text;        
            this.listViewListe.ItemsSource = CATEGORIE_MANAGER.GetList(Description, id_parent).DefaultView;            
        }

        /// <summary>
        /// Evenement appelé lorsque le textbox de recherche par description recoit le focus, permet de selectionner le texte a l'interieur
        /// </summary>
        /// <param name="sender">Objet qui déclenche l'événement</param>
        /// <param name="e">Parameètres de l'événement</param>
        private void tbxDescriptionSearch_GotFocus(object sender, MouseButtonEventArgs e)
        {
            if (!tbxDescriptionSearch.IsKeyboardFocusWithin)
            {
                tbxDescriptionSearch.Focus();
                e.Handled = true;
            }            
        }

        /// <summary>
        /// Méthode qui sélectionne le texte du controle textbox de la recherche par description
        /// </summary>
        /// <param name="sender">Objet qui déclenche l'événement</param>
        /// <param name="e">Parametres de l'evenement</param>
        private void SelectAllText(object sender, EventArgs e)
        {
            tbxDescriptionSearch.SelectAll();
        }

        /// <summary>
        /// Evenement lancé par la pression d'une touche dans le textBox de recherche par desciption, permet de valider la recherche par appui de la touche
        /// entrée
        /// </summary>
        /// <param name="sender">Objet qui déclenche l'événement</param>
        /// <param name="e">Paramètres de l'événement</param>
        private void tbxDescriptionSearch_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Return)
            {
                this.btnSearch_Click(tbxDescriptionSearch, e); 
            }
        }

        /// <summary>
        /// Evenement appelé par le clic sur le bouton dajout de nouvelle catégorie
        /// </summary>
        /// <param name="sender">Objet qui déclenche l'événement</param>
        /// <param name="e">Paramètre de l'événement</param>
        private void btnAddCategorie_Click(object sender, RoutedEventArgs e)
        {
            string aIntitule = tbxNom.Text;
            string aDescription = tbxDescription.Text;
            int? aPID = (cbbParent.SelectedValue == null || int.Parse(cbbParent.SelectedValue.ToString()) == -1) ? (int?) null : Int32.Parse(cbbParent.SelectedValue.ToString());
            if (String.IsNullOrEmpty(aIntitule) || String.IsNullOrEmpty(aDescription))
            {
                MessageBox.Show("Les champs de description et de nom de catégorie sont obligatoires");
            }
            else
            {
                if (CATEGORIE_MANAGER.Insert(aIntitule, aDescription, aPID) < 0)
                {
                    MessageBox.Show("Une erreur s'est produite lors de l'insertion");
                }
                PopulateAndBind();
            }
            
        }

        /// <summary>
        /// Evénement lancé par le clic sur bouton de validation des modifications
        /// </summary>
        /// <param name="sender">Objet qui déclenche l'événement</param>
        /// <param name="e">Parametres de l'événement</param>
        private void btnValiderModif_Click(object sender, RoutedEventArgs e)
        {
            int Id_cat = Int32.Parse(listViewListe.SelectedValue.ToString());
            string Intitule = tbxNom.Text;
            string Description = tbxDescription.Text;
            int? Pid_cat = (cbbParent.SelectedValue == null || int.Parse(cbbParent.SelectedValue.ToString()) == -1)? (int?) null : Int32.Parse(cbbParent.SelectedValue.ToString());

            if (CATEGORIE_MANAGER.Update(Id_cat,Intitule, Description, Pid_cat) < 0)
            {
                MessageBox.Show("Erreur lors de la mise à jour de la catégorie");
            }
            PopulateAndBind();
        }

        /// <summary>
        ///  Evénement lancé par la sélection d'un élément dans la listView principale
        /// </summary>
        /// <param name="sender">Controle qui déclenche l'événement</param>
        /// <param name="e">Parametre de l'événement</param>
        private void listViewList_selectChanged(object sender, EventArgs e)
        {
            btnValiderModif.IsEnabled = true;
            btnSupprimer.IsEnabled = true;
        }

        /// <summary>
        /// Evenement appelé lors de la suppression d'une catégorie
        /// </summary>
        /// <param name="sender">Controle qui déclenche l'événement</param>
        /// <param name="e">Arguments de l'événement</param>
        private void btnDelete_Click(object sender, RoutedEventArgs e)
        {
            //Verification des produits de la catégorie a supprimer
            int Id_cat = Int32.Parse(listViewListe.SelectedValue.ToString());
            DataTable dt = PRODUIT_MANAGER.GetList("", (int)Id_cat);

            if (dt.Rows.Count > 0)
            {
                MessageBox.Show("Suppression de la catégorie imossible car elle contient des produits");
            }
            else
            {
                //Vérification des sous catégories de la catégorie à supprimer
                dt = CATEGORIE_MANAGER.GetList("", Id_cat);
                if (dt.Rows.Count > 0)
                {
                    MessageBox.Show("Suppression de la catégorie impossible car elle contient des catégories enfant");
                }
                else
                {
                    if (CATEGORIE_MANAGER.Delete(Id_cat) < 1)
                    {
                        MessageBox.Show("Une erreur est survenue lors de la suppression de la catégorie");
                    }
                    else
                    {
                        MessageBox.Show("Suppression de la catégorie effectuée");
                    }
                    PopulateAndBind();
                }                
            }
        }

    }
}


